package main

import (
	"fmt"
	"math"
)

/**
 * 2.3 常量与枚举
 * 1.常量的定义
 * go语言常量可以不使用大小写，go语言中大小写有含义。
 * (1) const filename = "abc.txt"
 * (2) const数值可作为各种类型使用
 * (3) const a, b = 3,4
 * (4) var c int = int(math.Sqrt(a * a + b * b))
 *
 * 2.使用常量定义枚举类型
 * (1) 普通枚举类型
 * (2) 自增值枚举类型
 *
 * 3.变量定义要点回顾
 * (1) 变量类型写在变量名之后
 * (2) 编译器可推测变量类型
 * (3) 没有char，只有rune
 * (4) 原生支持复数类型
 *
 */
func main() {
	consts()
	enums()
}

/**
 * 1.常量的定义
 */
// 定义在函数外
// const filename = "abc.txt"

func consts() {
	//const filename = "abc.txt"
	//const a, b = 3, 4
	const (
		filename = "abc.txt"
		a, b     = 3, 4
	)
	var c int
	c = int(math.Sqrt(a*a + b*b))
	fmt.Println(filename, c)
}

/**
 * 2.使用常量定义枚举类型
 */
// go语言没有特殊的枚举关键字
func enums() {
	//const(
	//	cpp = 0
	//	java = 1
	//	python = 2
	//	golang = 3
	//)

	// go语言为一组const定义方法作了简化，iota表示这组const自增值
	//const(
	//	cpp = iota
	//	java
	//	python
	//	golang
	//)
	//fmt.Print(cpp, java, python, golang)

	// 跳过_该值
	const (
		cpp = iota
		_
		python
		golang
		javascript
	)
	fmt.Println(cpp, javascript, python, golang)

	// b, kb, mb, gb, tb, pb
	const (
		b = 1 << (10 * iota)
		kb
		mb
		gb
		tb
		pb
	)
	fmt.Println(b, kb, mb, gb, tb, pb)
}
